<?php
declare(strict_types=1);
namespace app\index\controller;
use aphp\core\Jump;
use aphp\core\Tool;

class Doc
{
    use Jump;

    //  文档列表
    public function index()
    {
        $book = db('book')->where('status=1')->cache()->column('title,is_public', 'id');
        $book_ids = array_keys($book);
        $where = [];
        $where['status'] = 1;
        $where[] = ['book_id', 'in', $book_ids];
        $list = db('doc')->field('id,title,book_id,summary,update_time,user_id')->where($where)->order('update_time DESC,id DESC')->paginate(10);
        return view()->with(['list' => $list, 'book' => $book]);
    }

    // 查看文档
    public function read(int $id = 1)
    {
        $vo = widget('common.doc')->get($id);
        if (empty($vo)) {
            $this->error('文档不存在');
        }
        // 检测文集状态
        if ($vo['book_status'] == 0) {
            $this->error('所属文集已住停用');
        }
        // 检测权限
        if ($vo['book_public'] != 1 && !check_prem_level(1, $vo['book_id'])) {
            if (str_contains(__HISTORY__, 'book/detail')) {
                $this->error('申请成员后才能查看。');
            }
            $this->_url('book/detail?id='.$vo['book_id']);
        }
        if ($this->isAjax()) {
            $this->_json(200, '', $vo);
        }
        return view();
    }

    // 搜索文档
    public function search(string $keyword, int $book_id)
    {
        $data = db('doc')->field('id,title')->where('book_id', $book_id)->where('title|markdown', 'like', '%' . $keyword . '%')->select();
        if (!empty($data)) {
            $this->_json(200, '', $data);
        }
        $this->error('未找到文档');
    }

    // 下载文档
    public function down(int $id)
    {
        $vo = widget('common.doc')->get($id);
        if (empty($vo)) {
            $this->error('文档不存在');
        }
        // 检测权限
        if ($vo['book_public'] != 1 && !check_prem_level(1, $vo['book_id'])) {
            $this->error('没有权限进行此操作');
        }
        $dir = ROOT_PATH.'/public/down/'.$vo['book_sign'];
        if (!is_dir($dir)) {
            Tool::dir_init($dir, 0777);
        }
        // 页脚
        $foot = "\n\n---\n\n本文档由 [AphpDoc](https://doc.aphp.top) 生成，更新于：" . date('Y-m-d H:i:s', $vo['update_time']);
        // 章节
        $chapter = get_chapter($id, $vo['book_id']);
        $file = $dir . '/_' . $chapter . '_' . $vo['sign'] . '.md'; // 文件路径
        if (file_exists($file)) {
            unlink($file);
        }
        file_put_contents($file, $vo['markdown'] . $foot); // 生成文件
        $url = str_replace(ROOT_PATH . '/public', __URL__, $file); // 文件url地址
        $this->_url($url); // 跳转文件下载
    }

    // 添加文档
    public function add(int $book_id, array $req)
    {
        // 验证权限
        if (!check_prem_level(2, $book_id)) {
            $this->error('没有权限进行此操作');
        }
        if ($this->isPost()) {
            $r = pdo()->trans(function () use ($req) {
                model('common.doc')->save($req);
            });
            $this->_jump(['添加成功', '添加失败'], $r, 'doc/read?id=' . get_start_id($book_id));
        }
        $book = db('book')->where('id', $book_id)->where('status=1')->cache()->find();
        if (empty($book)) {
            $this->error('当前无法添加文档');
        }
        return view()->with('book', $book);
    }

    // 编辑文档
    public function edit(int $id, array $req)
    {
        if ($this->isAjax() && $this->isGet()) {
            $vo = widget('common.doc')->get($id);
            if (empty($vo)) {
                $this->error('文档不存在');
            }
            $this->_json(200, '', $vo);
        }
        if ($this->isPost()) {
            $model = model('common.doc')->find($id);
            if (!$model) {
                $this->error('文档不存在');
            }
            // 验证权限
            if (!check_prem_level(2, $model->book_id)) {
                $this->error('没有权限进行此操作');
            }
            $r = pdo()->trans(function () use ($model, $req) {
                $model->save($req);
                $model->widgetReload();
            });
            $this->_jump(['修改成功', '修改失败'], $r, 'doc/read?id=' . $id);
        }
        return view();
    }

    // 删除文档
    public function del(int $id)
    {
        $book_id = db('doc')->where('id', $id)->cache()->value('book_id');
        // 验证权限
        if (!check_prem_level(3, $book_id)) {
            $this->error('没有权限进行此操作');
        }
        $r = db('doc')->where('id', $id)->delete();
        cache_clear();
        cli('clear:runtime index common');
        $this->_jump(['删除成功', '删除失败'], $r, 'doc/read?id=' . get_start_id($book_id));
    }
}